Feat/local convenience header#7070
Feat/local convenience header#7070shivansh023023 wants to merge 12 commits intoTheHPXProject:masterfrom
Conversation
|
Can one of the admins verify this patch? |
2540073 to
be0b7cd
Compare
|
Also, your new test causes compilation errors: https://github.com/STEllAR-GROUP/hpx/actions/runs/23336959505/job/67885450859?pr=7070 |
|
Thank you for the detailed review, @hkaiser I see the issue, including hpx_main.hpp in the core_local module was a mistake that caused the circular dependency and the CI failures. I am currently refactoring the PR to move the convenience header to a higher-level module (likely libs/full) and will update the copyright years and test logic accordingly. I'll push an update shortly. |
Moving the header to |
I completely understand, @hkaiser . Moving it to libs/full would indeed defeat the purpose for local-only users. I am refactoring the header within include_local to conditionally include hpx_main.hpp only when HPX_HAVE_NETWORKING (or the equivalent 'full' runtime flag) is defined. This should keep the core dependencies clean while still providing the convenience bundle for both local and full installations. I am also updating the copyrights to the 2020-2026 range as suggested. Updated PR coming in a few minutes. |
Add a single-include convenience header that bundles the Standard Parallel Toolkit: algorithm, execution, future, and numeric. In local-only builds (HPX_WITH_NETWORKING=OFF), hpx_main.hpp is also included for zero-boilerplate implicit main() wrapping. In full builds, the include is guarded to avoid a circular module dependency. Refs: TheHPXProject#7070
be0b7cd to
265bb1c
Compare
Add a single-include convenience header that bundles the Standard Parallel Toolkit: algorithm, execution, future, and numeric. In local-only builds (HPX_WITH_NETWORKING=OFF), hpx_main.hpp is also included for zero-boilerplate implicit main() wrapping. In full builds, the include is guarded to avoid a circular module dependency. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
265bb1c to
70dea5f
Compare
FWIW, the correct CMake flag is |
70dea5f to
478f834
Compare
Thank you for the tip, @hkaiser ! I've updated the code to use the canonical HPX_HAVE_DISTRIBUTED_RUNTIME macro in both the header and the unit test. This should resolve the circular dependency issues in the CI. |
478f834 to
023d94f
Compare
|
@shivansh023023 Please have a look at the CI results.There seem to be some problems with your changes. |
- local.hpp: use only source-tree headers (hpx/execution.hpp, hpx/numeric.hpp) instead of generated .hpp.in headers (algorithm.hpp, future.hpp) - local.hpp: remove all hpx_main.hpp references from comments - local_header.cpp: use hpx::local::init instead of hpx_main.hpp wrapping - tests/unit/CMakeLists.txt: remove HPX::wrap_main dependency Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
023d94f to
15b0e7d
Compare
- local.hpp: use only source-tree headers (hpx/execution.hpp, hpx/numeric.hpp) instead of generated .hpp.in headers (algorithm.hpp, future.hpp) - local.hpp: remove all hpx_main.hpp references from comments - local_header.cpp: use hpx::local::init instead of hpx_main.hpp wrapping - tests/unit/CMakeLists.txt: remove HPX::wrap_main dependency Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
15b0e7d to
9f4d518
Compare
- local.hpp: use only source-tree headers (hpx/execution.hpp, hpx/numeric.hpp) instead of generated .hpp.in headers (algorithm.hpp, future.hpp) - local.hpp: remove all hpx_main.hpp references from comments - local_header.cpp: use hpx::local::init instead of hpx_main.hpp wrapping - tests/unit/CMakeLists.txt: remove HPX::wrap_main dependency Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
9f4d518 to
80af546
Compare
…l.hpp
hpx/local.hpp is a convenience umbrella header for the Standard Parallel
Toolkit. It must never include hpx_main.hpp automatically because that
header has observable, TU-wide side effects:
1. On Linux/macOS with HPX_HAVE_DYNAMIC_HPX_MAIN, wrap_main.hpp emits
non-weak *strong* definitions of hpx_start::include_libhpx_wrap and
hpx_start::app_name_libhpx_wrap into every TU that includes it.
These conflict with the definitions in libhpx_wrap.so and cause
'multiple definition' linker errors in distributed-runtime builds
(e.g. the 18-contracts-lcos_local CI job).
2. Without HPX_HAVE_DYNAMIC_HPX_MAIN (static linking, Windows), it
executes '#define main hpx_startup::user_main', which silently
renames the program entry point in every TU and breaks test
executables that define their own main().
Both issues require that hpx_main.hpp remain an *explicit* user opt-in,
included only in the single translation unit that owns the program's
entry point. An umbrella convenience header is the wrong place for it.
Also remove the now-redundant #define HPX_NO_MAIN guard from the
local_header unit test since local.hpp no longer includes hpx_main.hpp.
Refs: TheHPXProject#7070
Signed-off-by: shivansh023023 <[email protected]>
Replace #include <hpx/init.hpp> with <hpx/modules/init_runtime_local.hpp> in the local_header unit test. In distributed builds (like the Windows CI), hpx/init.hpp resolves to libs/full/init_runtime/include/hpx/init.hpp which is a full-module header. Including it from a core-module test violates the module dependency boundary enforced by HPX_WITH_CHECK_MODULE_DEPENDENCIES=On, breaking the build. The test only uses hpx::local::init() and hpx::local::finalize(), both of which are declared in the core init_runtime_local module. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
Remove 'NOLIBS DEPENDENCIES HPX::hpx' from the local_header test. The NOLIBS + HPX::hpx combination explicitly linked the full distributed HPX target, which includes libhpx_wrap. This library provides its own main-wrapping symbols that conflict with the test's explicit main() definition, causing linker errors in the 18-contracts-lcos_local CI shard. Using the default add_hpx_executable linking (no NOLIBS, no explicit DEPENDENCIES) matches the pattern used by other core tests that need hpx::local::init() (e.g. async_combinators tests) and avoids pulling in the wrap module. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
- Remove stray blank line in tests/unit/CMakeLists.txt that failed cmake-format --check. - Sort includes in hpx_main.hpp alphabetically (hpx/config/static_linker_check.hpp before hpx/wrap_main.hpp) to satisfy clang-format. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
- local.hpp: use only source-tree headers (hpx/execution.hpp, hpx/numeric.hpp) instead of generated .hpp.in headers (algorithm.hpp, future.hpp) - local.hpp: remove all hpx_main.hpp references from comments - local_header.cpp: use hpx::local::init instead of hpx_main.hpp wrapping - tests/unit/CMakeLists.txt: remove HPX::wrap_main dependency Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
…l.hpp
hpx/local.hpp is a convenience umbrella header for the Standard Parallel
Toolkit. It must never include hpx_main.hpp automatically because that
header has observable, TU-wide side effects:
1. On Linux/macOS with HPX_HAVE_DYNAMIC_HPX_MAIN, wrap_main.hpp emits
non-weak *strong* definitions of hpx_start::include_libhpx_wrap and
hpx_start::app_name_libhpx_wrap into every TU that includes it.
These conflict with the definitions in libhpx_wrap.so and cause
'multiple definition' linker errors in distributed-runtime builds
(e.g. the 18-contracts-lcos_local CI job).
2. Without HPX_HAVE_DYNAMIC_HPX_MAIN (static linking, Windows), it
executes '#define main hpx_startup::user_main', which silently
renames the program entry point in every TU and breaks test
executables that define their own main().
Both issues require that hpx_main.hpp remain an *explicit* user opt-in,
included only in the single translation unit that owns the program's
entry point. An umbrella convenience header is the wrong place for it.
Also remove the now-redundant #define HPX_NO_MAIN guard from the
local_header unit test since local.hpp no longer includes hpx_main.hpp.
Refs: TheHPXProject#7070
Signed-off-by: shivansh023023 <[email protected]>
Replace #include <hpx/init.hpp> with <hpx/modules/init_runtime_local.hpp> in the local_header unit test. In distributed builds (like the Windows CI), hpx/init.hpp resolves to libs/full/init_runtime/include/hpx/init.hpp which is a full-module header. Including it from a core-module test violates the module dependency boundary enforced by HPX_WITH_CHECK_MODULE_DEPENDENCIES=On, breaking the build. The test only uses hpx::local::init() and hpx::local::finalize(), both of which are declared in the core init_runtime_local module. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
Remove 'NOLIBS DEPENDENCIES HPX::hpx' from the local_header test. The NOLIBS + HPX::hpx combination explicitly linked the full distributed HPX target, which includes libhpx_wrap. This library provides its own main-wrapping symbols that conflict with the test's explicit main() definition, causing linker errors in the 18-contracts-lcos_local CI shard. Using the default add_hpx_executable linking (no NOLIBS, no explicit DEPENDENCIES) matches the pattern used by other core tests that need hpx::local::init() (e.g. async_combinators tests) and avoids pulling in the wrap module. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
19a2632 to
65d3736
Compare
- Remove stray blank line in tests/unit/CMakeLists.txt that failed cmake-format --check. - Sort includes in hpx_main.hpp alphabetically (hpx/config/static_linker_check.hpp before hpx/wrap_main.hpp) to satisfy clang-format. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
The HPX build system (hpx_setup_target) unconditionally links HPX::wrap_main for all executables unless NOLIBS is set. wrap_main redefines main() via -Wl,-wrap=main, which conflicts with any test that defines its own main(). Fix: use NOLIBS DEPENDENCIES hpx_core (matching the pattern of every other core module test: contracts, serialization, functional, etc.) and simplify the test to a compile-and-link sanity check that only verifies hpx/local.hpp is self-contained and provides the expected types. No HPX runtime startup needed. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
GitHub Actions promoted windows-latest to Windows Server 2025 (VS 17.14), which lacks the 'Visual Studio 17 2022' generator, breaking all Windows workflows. This pins them to windows-2022 to restore functionality. Refs: TheHPXProject#7070
|
Hi @hkaiser I've just pushed a fix to resolve the failures in the 18-contracts-lcos_local and Windows CI checks. The issue stemmed from a module boundary violation in the new convenience header tests. Specifically, I was transitively pulling in hpx/init.hpp (a 'full' runtime component) from within a core module test. On CI shards where HPX_WITH_CHECK_MODULE_DEPENDENCIES is enabled, this triggered a forbidden dependency error that halted the Ninja build. Additionally, I’ve refined the guards around the hpx_main.hpp inclusion in hpx/local.hpp to ensure we don't accidentally redefine main during core unit tests, which was causing linker conflicts in the LCO test shards. I've switched the implementation to use <hpx/modules/init_runtime_local.hpp> to maintain a strict core-only dependency chain. |
Move the -Wl,-wrap=main compile-time diagnostic into an isolated header (hpx/config/static_linker_check.hpp) in the config module to avoid circular module dependencies. The header emits a #warning when all of these hold: - __linux__ is defined - HPX_HAVE_DYNAMIC_HPX_MAIN is defined (generated config) - HPX_HAVE_STATIC_LINKING is defined (generated config) - HPX_HAVE_WRAP_MAIN_CONFIGURED is NOT defined CMake consumers are unaffected: hpx_wrap and hpx_auto_wrap inject HPX_HAVE_WRAP_MAIN_CONFIGURED via INTERFACE compile definitions. Refs: TheHPXProject#7068, TheHPXProject#7072 Signed-off-by: shivansh023023 <[email protected]>
- local.hpp: use only source-tree headers (hpx/execution.hpp, hpx/numeric.hpp) instead of generated .hpp.in headers (algorithm.hpp, future.hpp) - local.hpp: remove all hpx_main.hpp references from comments - local_header.cpp: use hpx::local::init instead of hpx_main.hpp wrapping - tests/unit/CMakeLists.txt: remove HPX::wrap_main dependency Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
- Use direct module includes (hpx/modules/...) to avoid top-level cycles - Apply hpxinspect:noinclude to hpx_main.hpp to bypass CI boundary checks - Use HPX_NO_MAIN in unit tests to prevent linking against wrap module - Update copyright years to 2020-2026
…processor guard - Changed to in local.hpp. Including hpx_main.hpp in a distributed build causes main() to be macro-replaced with hpx_startup::user_main, leading to linkage errors in tests that manually define main() but happen to include headers that pull in local.hpp. Signed-off-by: shivansh023023 <[email protected]>
…l.hpp
hpx/local.hpp is a convenience umbrella header for the Standard Parallel
Toolkit. It must never include hpx_main.hpp automatically because that
header has observable, TU-wide side effects:
1. On Linux/macOS with HPX_HAVE_DYNAMIC_HPX_MAIN, wrap_main.hpp emits
non-weak *strong* definitions of hpx_start::include_libhpx_wrap and
hpx_start::app_name_libhpx_wrap into every TU that includes it.
These conflict with the definitions in libhpx_wrap.so and cause
'multiple definition' linker errors in distributed-runtime builds
(e.g. the 18-contracts-lcos_local CI job).
2. Without HPX_HAVE_DYNAMIC_HPX_MAIN (static linking, Windows), it
executes '#define main hpx_startup::user_main', which silently
renames the program entry point in every TU and breaks test
executables that define their own main().
Both issues require that hpx_main.hpp remain an *explicit* user opt-in,
included only in the single translation unit that owns the program's
entry point. An umbrella convenience header is the wrong place for it.
Also remove the now-redundant #define HPX_NO_MAIN guard from the
local_header unit test since local.hpp no longer includes hpx_main.hpp.
Refs: TheHPXProject#7070
Signed-off-by: shivansh023023 <[email protected]>
Replace #include <hpx/init.hpp> with <hpx/modules/init_runtime_local.hpp> in the local_header unit test. In distributed builds (like the Windows CI), hpx/init.hpp resolves to libs/full/init_runtime/include/hpx/init.hpp which is a full-module header. Including it from a core-module test violates the module dependency boundary enforced by HPX_WITH_CHECK_MODULE_DEPENDENCIES=On, breaking the build. The test only uses hpx::local::init() and hpx::local::finalize(), both of which are declared in the core init_runtime_local module. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
Remove 'NOLIBS DEPENDENCIES HPX::hpx' from the local_header test. The NOLIBS + HPX::hpx combination explicitly linked the full distributed HPX target, which includes libhpx_wrap. This library provides its own main-wrapping symbols that conflict with the test's explicit main() definition, causing linker errors in the 18-contracts-lcos_local CI shard. Using the default add_hpx_executable linking (no NOLIBS, no explicit DEPENDENCIES) matches the pattern used by other core tests that need hpx::local::init() (e.g. async_combinators tests) and avoids pulling in the wrap module. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
- Remove stray blank line in tests/unit/CMakeLists.txt that failed cmake-format --check. - Sort includes in hpx_main.hpp alphabetically (hpx/config/static_linker_check.hpp before hpx/wrap_main.hpp) to satisfy clang-format. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
The HPX build system (hpx_setup_target) unconditionally links HPX::wrap_main for all executables unless NOLIBS is set. wrap_main redefines main() via -Wl,-wrap=main, which conflicts with any test that defines its own main(). Fix: use NOLIBS DEPENDENCIES hpx_core (matching the pattern of every other core module test: contracts, serialization, functional, etc.) and simplify the test to a compile-and-link sanity check that only verifies hpx/local.hpp is self-contained and provides the expected types. No HPX runtime startup needed. Refs: TheHPXProject#7070 Signed-off-by: shivansh023023 <[email protected]>
…er test, and revert CI changes
02c82c1 to
53e40b0
Compare
…ove unrelated CI changes
Fixes # — N/A (new feature)
Proposed Changes
hpx/local.hppconvenience header that bundleshpx_main.hpp,algorithm.hpp,execution.hpp,future.hpp, andnumeric.hppinto a single include for single-node HPX usage.
include_local/CMakeLists.txtso it iscorrectly installed and exported.
local_header.cpp) verifying thathpx::async,hpx::for_each, andhpx::reduceare all reachable through thesingle include.
Any background context you want to provide?
This follows the existing "convenience bundle" pattern already established
in the
include_localmodule (e.g.,hpx/execution.hppbundles fourexecution modules,
hpx/numeric.hppbundleshpx/modules/algorithms.hpp).The header directly supports the 2026 GSoC "Compiler Explorer Integration"
by providing a canonical single-header entry point for browser-based
development. On Godbolt, users currently need 4-5 separate
#includelines to write a basic parallel HPX program. With
hpx/local.hpp, thedefault code snippet becomes:
The header includes
hpx_main.hppfor automatic main wrapping, sousers do not need to write any HPX boilerplate.
Checklist
I have fixed a bug and have added a regression test.— N/AI have added a test using random numbers— N/A